/*
 * libPath.c
 *
 *  Created on: 26/04/2012
 *      Author: utnso
 */

#include "libPath.h"
#include <stdio.h>

void  parsearPath(char* path, nodoNombreDirOArch_t** colaFte, nodoNombreDirOArch_t** colaFin){
	printf("Parsear Path Inicia: %s\n", path);
	uint8_t desplazamiento = 0;

	while(path[desplazamiento] != '\0'){
		if(path[desplazamiento] == '/'){
			desplazamiento++;
		}else{
			uint8_t tamanioNombre;
			for(tamanioNombre = 0; path[desplazamiento + tamanioNombre] != '/' && path[desplazamiento + tamanioNombre] != '\0'; tamanioNombre++);

			char* nombre = (char*) malloc(tamanioNombre + 1);
			memset(nombre, '\0', tamanioNombre + 1);
			memcpy(nombre, path + desplazamiento, tamanioNombre);
			encolarNombreDirOArch(colaFte, colaFin, nombre);
			free(nombre);

			desplazamiento += tamanioNombre;
		}
	}
	printf("ColaFte->nombre: [%s]\n", (*colaFte)->nombre);
}

void apilarNombreDirOArch(nodoNombreDirOArch_t** pilaFte, char* nombre){
	nodoNombreDirOArch_t* nue = (nodoNombreDirOArch_t*) malloc(sizeof(nodoNombreDirOArch_t));
	nue->nombre = (char*) malloc(strlen(nombre) + 1);
	memset(nue->nombre, '\0', strlen(nombre) + 1);
	strcpy(nue->nombre, nombre);
	nue->sig = *pilaFte;
	*pilaFte = nue;
}

void desapilarNombreDirOArch(nodoNombreDirOArch_t** pilaFte, char** nombre){
	nodoNombreDirOArch_t* aux = (nodoNombreDirOArch_t*) malloc(sizeof(nodoNombreDirOArch_t));
	aux = *pilaFte;
	*nombre = (char*) malloc(strlen(aux->nombre) + 1);
	memset(*nombre, '\0', strlen(aux->nombre) + 1);
	strcpy(*nombre, aux->nombre);
	*pilaFte = (*pilaFte)->sig;
	free(aux->nombre);
	free(aux);
}

void encolarNombreDirOArch(nodoNombreDirOArch_t** colaFte, nodoNombreDirOArch_t** colaFin, char* nombre){
	nodoNombreDirOArch_t* aux = malloc(sizeof(nodoNombreDirOArch_t));
	aux->nombre = malloc(strlen(nombre) + 1);
	memset(aux->nombre, '\0', strlen(nombre) + 1);
	memcpy(aux->nombre, nombre, strlen(nombre));
	aux->sig = NULL;
	if(*colaFte == NULL){
		*colaFte = aux;
	}else{
		(*colaFin)->sig = aux;
	}
	*colaFin = aux;
}

void desencolarNombreDirOArch(nodoNombreDirOArch_t** colaFte, nodoNombreDirOArch_t** colaFin, char** nombre){
	nodoNombreDirOArch_t* aux = malloc(sizeof(nodoNombreDirOArch_t));
	aux = *colaFte;
	(*colaFte) = (*colaFte)->sig;
	if(colaFte == NULL){
		*colaFin = NULL;
	}
	*nombre = malloc(strlen(aux->nombre) + 1);
	memset(*nombre, '\0', strlen(aux->nombre) + 1);
	memcpy(*nombre, aux->nombre, strlen(aux->nombre));
	free(aux);
}

void sacarUltimoNodoDeUnaCola(nodoNombreDirOArch_t **colaFte, nodoNombreDirOArch_t **colaFin){
	printf("archivo que saco de la pila: %s\n", (*colaFin)->nombre);
	nodoNombreDirOArch_t* aux =  malloc(sizeof(nodoNombreDirOArch_t));
	aux = *colaFte;
	nodoNombreDirOArch_t* ant = malloc(sizeof(nodoNombreDirOArch_t));
	ant = NULL;
	nodoNombreDirOArch_t* dobleAnt = malloc(sizeof(nodoNombreDirOArch_t));
	dobleAnt = NULL;
	while(aux != NULL){
		dobleAnt = ant;
		ant = aux;
		aux = aux->sig;
	}
	dobleAnt->sig = NULL;
	free(ant);
	free(aux);
}

void concatenarDosPaths(char** cadena1, char* cadena2){
	uint8_t offset = strlen(*cadena1);
	strcpy(*cadena1 +offset, "/");
	strcpy(*cadena1 +offset+1, cadena2);
	return;
}

char* concatenarPath(nodoNombreDirOArch_t *pila){
	uint8_t tamaniooDePath = 1;
	printf("concatenar path inicia: %s\n", pila->nombre);
	nodoNombreDirOArch_t* aux = malloc(sizeof(nodoNombreDirOArch_t));
	aux = pila;
	while(aux != NULL){
		tamaniooDePath += strlen(aux->nombre)+1;
		aux = aux->sig;
	}
	printf("tamino de path: %d\n", tamaniooDePath);
	free(aux);
	char* path = malloc(tamaniooDePath);
	while(pila != NULL){
		concatenarDosPaths(&path, pila->nombre);
		pila = pila->sig;
	}
	printf("concatenar path finaliza: \n");
	return path;
}

char* obtenerPathDeDirectorio(char* pathDeArchivo){
	printf("obtener Path de Directorio\n");
	nodoNombreDirOArch_t *colaFte = NULL;
	nodoNombreDirOArch_t *colaFin = NULL;
	parsearPath(pathDeArchivo, &colaFte, &colaFin);
	sacarUltimoNodoDeUnaCola(&colaFte, &colaFin);
 	char* pathDirectorio = concatenarPath(colaFte);
	printf("Path de directorio: %s\n", pathDirectorio);
	return pathDirectorio;
}


